#ifndef __FACTOR_HPP__
#define __FACTOR_HPP__

#include "Paire.hpp"
#include <iostream>

using namespace std;



const int tailleMax = 1000000;




class Erathostene;
class Polynome;

class Factor : public Paire
{
   protected :
      
      int     _nbPaire;
      Paire * _tabPaire;
      int     _tailleRelle;
      
   public :
      
      Factor(char * inChaine);
      
      Factor( int inNbPaire);
      
      Factor() { _nbPaire = 0; }     
      Factor(Factor & inFactor)
      {
         _nbPaire = inFactor._nbPaire;
         _tailleRelle = inFactor._tailleRelle;
         _tabPaire = new Paire[_nbPaire];
         for(int i = 0 ; i < _nbPaire ; i++)
         {
            _tabPaire[i] = inFactor._tabPaire[i];
         }
      }
      ~Factor();
   
      void purgeBase()
      {
         for(int i = 0 ; i < _tailleRelle ; i++)
         {
            _tabPaire[i].setPaire(0,0);
         }
         _tailleRelle = 0;
      }
      
      void rationnalBase(mpz_class ** inNbPremier, mpz_class inM);
      
      int  algebraicBase(mpz_class ** inNbPremier, int indiceMax, Polynome & inPoly);
      
      void quadraticCharacterBase(mpz_class ** inNbPremier, int indiceDebut, int indiceMax, Polynome & inPoly); 
      
      void setPaire(int inIndice, mpz_class inA, mpz_class inB) { _tabPaire[inIndice].setPaire(inA, inB); }
      
      int getPaire() const { return _nbPaire; }

      int getTaille() const { return _tailleRelle; }
      
      Paire getPaire(int inIndice) const { return _tabPaire[inIndice] ; }
   
      friend ostream & operator << ( ostream & o,const Factor & inFactor);
      
      bool add(Paire & inPaire);
      
      void setPaire(Paire * inPaire, int inNbPaire) { _tabPaire = inPaire; _tailleRelle = inNbPaire; }
      
      
      
      Factor & operator=(const Factor & inFactor)
      {
         if(this == &inFactor)
         {
            delete [] _tabPaire;
            _nbPaire = inFactor._nbPaire;
            _tailleRelle = inFactor._tailleRelle;
            _tabPaire = new Paire[_nbPaire];
            for(int i = 0 ; i < _nbPaire ; i++)
            {
               _tabPaire[i] = inFactor._tabPaire[i];
            }
         }
         
         return *this;
      }
      
      char * converMPI() const;
      
      bool converFactor(char * inChaine);
      
      static void generateFile(Factor & AFB, Factor & RFB, Factor & QCB, Factor & AB);
};

#endif
